<?php
abstract class DbAbstract {
	/** 数据库连接信息 **/
    protected $_dsn;
    /** 数据库访问对象 ID **/
    protected $_id;
	/** 数据库连接句柄 **/
    protected $_conn;

	protected $_fetch_mode = 2;

	/**
	 * (功能描述) 构造函数
     *
     * @param mixed $dsn
     * @param string $id 
	 */
    protected function __construct($dsn, $id)
    {
        $this->_dsn = $dsn;
        $this->_id = $id;
    }

	/** 连接数据库，失败时抛出异常：如果已经连接到了数据库，再次连接不会造成任何影响。 **/
    abstract function connect();
    /** 创建一个持久连接，失败时抛出异常：如果已经连接到了数据库，再次连接不会造成任何影响。 **/
    abstract function pconnect();
    /** 强制创建一个新连接，失败时抛出异常：如果已经连接到了数据库，再次连接不会造成任何影响。 **/
    abstract function nconnect();
    /** 关闭数据库连接 **/
    abstract function close();

    /**
     * (功能描述) 确认是否已经连接到数据库
     *
     * @return boolean
     */
    function isConnected()
    {
        return is_resource($this->_conn);
    }

	/**
	 * (功能描述) 返回数据库访问对象使用的 DSN
     *
     * @return mixed
	 */
    function getDSN()
    {
        return $this->_dsn;
    }

    /**
     * (功能描述) 返回数据库访问对象的 ID
     *
     * @return string
     */
    function getID()
    {
        return $this->_id;
    }

	/**
	 * (功能描述) 安全过滤
	 *
	 * @param array|string $names
     * @param string $as
	 * @return
	 */
	function safeFilter($names, $as = null)
	{
		return trim($names);
	}


	/** 为数据表产生下一个序列值，失败时抛出异常 **/
	abstract function nextID($table_name, $field_name, $start_value = 1);
	/** 获取自增字段的最后一个值或者 nextID() 方法产生的最后一个值 **/ 
    abstract function insertID();

	/** 返回最近一次数据库操作受到影响的记录数 **/
    abstract function affectedRows();
	/**  **/
	abstract function selectLimit($sql, $offset = 0, $length = 30, array $inputarr = null);
	/**  **/
	abstract function execute($sql, $inputarr = null);

	/**  **/
	function select()
	{
		
	}

	/**  **/
	function insert()
	{
		
	}

	/**  **/
	function update()
	{
		
	}

	/** 删除指定数据表中符合条件的记录 **/
    function delete($table_name, array $where = null)
    {
        list ($where) = $this->parseSQLInternal($table_name, $where);
        $sql = 'DELETE FROM ' . $this->qid($table_name);
        if ($where)
        {
            $sql .= ' WHERE ' . $where;
        }
        $this->execute($sql);
    }



	/** 关闭数据库连接后清理资源 **/
    protected function _clear()
    {
        $this->_conn = null;
    }
}
?>